package ai

import (
	"embed"
	"fmt"
)

//go:embed prompts/*.md
var promptsFS embed.FS

// PromptEngine 提示词引擎
type PromptEngine struct {
	contents map[string]string // 存储模板内容
}

// PromptData 提示词数据（用于 Stage 1）
type PromptData struct {
	Summary    string
	Motivation string
	ChangeType string
}

// Stage2PromptData 提示词数据（用于 Stage 2）
type Stage2PromptData struct {
	Summary              string
	Motivation           string
	Priority             string
	TargetUsers          string
	KeyFeatures          []string
	AffectedCapabilities []string
	BreakingChanges      bool
}

// Stage3PromptData 提示词数据（用于 Stage 3）
type Stage3PromptData struct {
	Requirements []Requirement
}

// Requirement 需求定义
type Requirement struct {
	ReqID       string
	Name        string
	Description string
}

// NewPromptEngine 创建提示词引擎并加载所有模板
func NewPromptEngine() (*PromptEngine, error) {
	engine := &PromptEngine{
		contents: make(map[string]string),
	}

	// 加载所有模板文件
	templateFiles := []string{
		"stage1_supplement.md",
		"stage1_iterate.md",
		"stage2_supplement.md",
		"stage2_iterate.md",
		"stage3_supplement.md",
		"stage3_iterate.md",
	}

	for _, filename := range templateFiles {
		if err := engine.loadTemplate(filename); err != nil {
			return nil, fmt.Errorf("failed to load template %s: %w", filename, err)
		}
	}

	return engine, nil
}

// loadTemplate 加载单个模板文件
func (e *PromptEngine) loadTemplate(filename string) error {
	// 读取文件内容
	content, err := promptsFS.ReadFile("prompts/" + filename)
	if err != nil {
		return fmt.Errorf("failed to read file: %w", err)
	}

	// 提取模板名称（去掉 .md 后缀）
	name := filename[:len(filename)-3]

	// 存储模板内容
	e.contents[name] = string(content)

	return nil
}

// RenderPrompt 渲染提示词
// name: 模板名称（如 "stage1_supplement"）
// data: 提示词数据
func (e *PromptEngine) RenderPrompt(name string, data interface{}) (string, error) {
	// 查找模板内容
	content, ok := e.contents[name]
	if !ok {
		return "", fmt.Errorf("template not found: %s", name)
	}

	// 根据不同的模板类型附加用户数据
	switch name {
	case "stage1_supplement", "stage1_iterate":
		promptData, ok := data.(PromptData)
		if !ok {
			return "", fmt.Errorf("invalid data type for %s, expected PromptData", name)
		}
		return fmt.Sprintf(`%s

---

## 用户输入数据

请基于以下用户输入补充 proposals 字段：

`+"```json\n"+`{
  "summary": "%s",
  "motivation": "%s",
  "change_type": "%s"
}
`+"```\n",
			content,
			promptData.Summary,
			promptData.Motivation,
			promptData.ChangeType), nil

	case "stage2_supplement", "stage2_iterate":
		promptData, ok := data.(Stage2PromptData)
		if !ok {
			return "", fmt.Errorf("invalid data type for %s, expected Stage2PromptData", name)
		}
		keyFeaturesJSON := "["
		for i, f := range promptData.KeyFeatures {
			if i > 0 {
				keyFeaturesJSON += ", "
			}
			keyFeaturesJSON += fmt.Sprintf(`"%s"`, f)
		}
		keyFeaturesJSON += "]"

		affectedCapsJSON := "["
		for i, c := range promptData.AffectedCapabilities {
			if i > 0 {
				affectedCapsJSON += ", "
			}
			affectedCapsJSON += fmt.Sprintf(`"%s"`, c)
		}
		affectedCapsJSON += "]"

		return fmt.Sprintf(`%s

---

## 用户输入数据（已确认的 proposals）

请基于以下已确认的 proposals 数据生成 requirements：

`+"```json\n"+`{
  "summary": "%s",
  "motivation": "%s",
  "priority": "%s",
  "target_users": "%s",
  "key_features": %s,
  "affected_capabilities": %s,
  "breaking_changes": %v
}
`+"```\n",
			content,
			promptData.Summary,
			promptData.Motivation,
			promptData.Priority,
			promptData.TargetUsers,
			keyFeaturesJSON,
			affectedCapsJSON,
			promptData.BreakingChanges), nil

	case "stage3_supplement", "stage3_iterate":
		promptData, ok := data.(Stage3PromptData)
		if !ok {
			return "", fmt.Errorf("invalid data type for %s, expected Stage3PromptData", name)
		}
		reqsJSON := "[\n"
		for i, req := range promptData.Requirements {
			if i > 0 {
				reqsJSON += ",\n"
			}
			reqsJSON += fmt.Sprintf(`  {
    "req_id": "%s",
    "name": "%s",
    "description": "%s"
  }`, req.ReqID, req.Name, req.Description)
		}
		reqsJSON += "\n]"

		return fmt.Sprintf(`%s

---

## 用户输入数据（已确认的 requirements）

请基于以下已确认的 requirements 生成 scenarios：

`+"```json\n"+`%s
`+"```\n",
			content,
			reqsJSON), nil

	default:
		// 未知模板，返回错误
		return "", fmt.Errorf("unknown template: %s", name)
	}
}

// ValidateVariables 验证必填变量（预留接口）
func (e *PromptEngine) ValidateVariables(name string, data interface{}) error {
	// 当前实现：检查数据是否为 nil
	if data == nil {
		return fmt.Errorf("data cannot be nil")
	}
	return nil
}
